{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Grover's algorithm examples\n",
    "\n",
    "This notebook has examples demonstrating how to use the Qiskit [Grover](https://qiskit.org/documentation/stubs/qiskit.aqua.algorithms.Grover.html) search algorithm, with different oracles."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pylab\n",
    "import numpy as np\n",
    "from qiskit import BasicAer\n",
    "from qiskit.tools.visualization import plot_histogram\n",
    "from qiskit.aqua import QuantumInstance\n",
    "from qiskit.aqua.algorithms import Grover\n",
    "from qiskit.aqua.components.oracles import LogicalExpressionOracle, TruthTableOracle"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Finding solutions to 3-SAT problems\n",
    "\n",
    "Let's look at an example 3-Satisfiability (3-SAT) problem and walk-through how we can use Quantum Search to find its satisfying solutions. 3-SAT problems are usually expressed in [Conjunctive Normal Forms (CNF)](https://en.wikipedia.org/wiki/Conjunctive_normal_form) and written in the [DIMACS-CNF](http://www.satcompetition.org/2009/format-benchmarks2009.html) format. For example:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "input_3sat_instance = '''\n",
    "c example DIMACS-CNF 3-SAT\n",
    "p cnf 3 5\n",
    "-1 -2 -3 0\n",
    "1 -2 3 0\n",
    "1 2 -3 0\n",
    "1 -2 -3 0\n",
    "-1 2 3 0\n",
    "'''"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The CNF of this 3-SAT instance contains 3 variables and 5 clauses:\n",
    "\n",
    "$(\\neg v_1 \\vee \\neg v_2 \\vee \\neg v_3) \\wedge (v_1 \\vee \\neg v_2 \\vee v_3) \\wedge (v_1 \\vee v_2 \\vee \\neg v_3) \\wedge (v_1 \\vee \\neg v_2 \\vee \\neg v_3) \\wedge (\\neg v_1 \\vee v_2 \\vee v_3)$\n",
    "\n",
    "It can be verified that this 3-SAT problem instance has three satisfying solutions:\n",
    "\n",
    "$(v_1, v_2, v_3) = (T, F, T)$ or $(F, F, F)$ or $(T, T, F)$\n",
    "\n",
    "Or, expressed using the DIMACS notation:\n",
    "\n",
    "`1 -2 3`, or `-1 -2 -3`, or `1 2 -3`.\n",
    "\n",
    "With this example problem input, we then create the corresponding `oracle` for our `Grover` search. In particular, we use the `LogicalExpressionOracle` component, which supports parsing DIMACS-CNF format strings and constructing the corresponding oracle circuit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "oracle = LogicalExpressionOracle(input_3sat_instance)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `oracle` can now be used to create an Grover instance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "grover = Grover(oracle)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can then configure the backend and run the Grover instance to get the result:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 2, -3]\n"
     ]
    }
   ],
   "source": [
    "backend = BasicAer.get_backend('qasm_simulator')\n",
    "quantum_instance = QuantumInstance(backend, shots=1024)\n",
    "result = grover.run(quantum_instance)\n",
    "print(result.assignment)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As seen above, a satisfying solution to the specified 3-SAT problem is obtained. And it is indeed one of the three satisfying solutions.\n",
    "\n",
    "Since we used the `'qasm_simulator'`, the complete measurement result is also returned, as shown in the plot below, where it can be seen that the binary strings `000`, `011`, and `101` (note the bit order in each string), corresponding to the three satisfying solutions all have high probabilities associated with them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "tags": [
     "nbsphinx-thumbnail"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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0w5l3njjDb7zne8wffp0unXrVru8urqaTZs20aVLF9566y3eeustjj76aAA+/PBDevbsibvz17/+lREjRqR1v0RanaZcKN1dH+pEJJny1FNP+aBBg3zAgAH+s5/9zN3dr7rqKn/88cfd3f3II4/0bt26eWFhoRcWFvpxxx3n7u5bt271goICLygo8JKSEn/jjTdqtzl+/HgfMWKEDx8+3E8//XTfvHlz+ncsBzzzzDM+ePBg33///f2GG27Yaf3NN9/sBQUFfsABB/gRRxzhq1atql136aWX+rBhw3zo0KF+wQUX+Jdffunu7pWVlX7uuef6oEGDfMiQIf7II4+kbX+k5dHETkQZT2KZfCiBirQuVVVVPmDAAP/73//ulZWVfuCBB/rixYt3KPPiiy/6559/7u7ut99+u59yyinu7v7KK6/46NGjvaqqyquqqvyQQw7xl156yd3dr776ar/iiivc3b26uto/+uij9O2UtLimJlBNJi8ircb8+fMZOHAgAwYMYM899+S0007j8ccf36HM+PHj2XvvvQE45JBDqKioAMDM2LZtG9u3b6eyspIvvviC7t3DoIJ77rmHyy8Pk6m1adOGrl27pnGvJFOUQEWk1WjOEKLS0lLGjx9Pz5496dmzJxMmTKCgoIBNmzYBcNVVV1FUVMTJJ5/MunV154uR3ZESqIhIPeoOIXrvvfd45513amfQefHFF3n55ZepqqqioqKC0aNHU15eTmlpKZdccskuti67AyVQEWk1mjOE6LHHHuOQQw6hffv2tG/fnmOOOYa5c+fSpUsX9t57b0444QQATj755Nrp9WT3pgTaTHEnBX/ppZdqJ/0eOXIke+21F3/9618BeOGFFygqKmLkyJGMGTOG9957L637JLK7ShxCtH37dqZNm8akSZN2KFMzhOiJJ57YYQjRvvvuy6xZs6iqquKLL75g1qxZFBQUYGYcd9xxtfNqv/DCCwwbNiyduyWZ0pSeRrvro7m9cJvToy/Rhg0bvFOnTrXlBg0a5EuWLHF399/85jd+5plnNitOEfmXuEOIqqqq/LzzzvOhQ4d6QUGBX3TRRbXbXLVqlR922GG1Q1/ef//99O+YtBia2As3rRMp7G4Se/QBtT36Es8+x48fX/v8kEMO4YEHHthpO4888gjHHHNMbc8/M6u988Gnn35Kr169UrkbIq3KxIkTmThx4g7Lrr322trnzz//fL3va9u2LXfeeWe96/bbb7/aO5hI66EE2gz19eiruXVOfRJ79CWaNm0aF198ce3r3//+90ycOJF27drRsWNHXnvttZYNXEREmk3XQNOkbo++Gh9++CFvv/02EyZMqF32q1/9iqeffpqKigrOOuusHZKriIhkB9VAmyHZHn2zZs3aYVJwgD//+c8cf/zx7LHHHgB89NFHLFy4kJKSEgBOPfVUvv71r6dwL0REJA7VQJuhOT36ajz44INMnjy59nWnTp349NNPWbZsGQDPPfccBQUFqd0RERFJmmqgzZCXl8dtt93GhAkTqK6u5uyzz2b48OFcffXVFBcXM2nSJC699FK2bNnCySefDISu8E888QQAq1atYvXq1YwbN26Hbd51112ceOKJtGnThk6dOnHPPfdkZP8ktc69JbXbv+vC1G5fpLWz0GO3dSouLvaysrJMhyGtlBKoSHYyswXuXryrcmrCFRERiUEJVEREJAYlUBERkRiUQEVERGJQAhUREYlBw1hEpNVJZQ9o9X5uPVQDFRERiUEJVEREJAYlUBERkRiUQEVERGJQAhUREYlBvXBbgOY0FRFpfVQDFRERiUEJVEREJAYlUBERkRiUQEVERGJQAhUREYlBCVRERCQGJVAREZEYlEBFRERiUAIVERGJQQlUREQkBiVQERGRGJRARUREYlACFRERiUEJVEREJAYlUBERkRiUQEVERGJQAhUREYlBCVRERCQGJVAREZEYlEBFRERiUAIVERGJQQlUREQkBiVQERGRGJRARUREYlACFRERiSHtCdTMvmdmK81sm5ktMLPDGil7gpnNMLOPzGyzmc0zs0mNlJ9sZm5mf0tN9CIiIkFaE6iZnQrcClwPHAS8CjxjZvs28JZxwIvAsVH5p4HH6ku6ZjYA+AXwcgpCFxER2UG6a6AXA39097vc/R13vwD4EPhufYXd/b/c/UZ3n+/u77n7T4AFwDcTy5nZHsCDwBXAitTugoiISBoTqJntCYwCZtRZNQMYncSmOgCf1Fl2HbDK3e+NH6GIiEjT5aXx/+oKtAXW1Vm+DvhaUzZgZt8H+gD3Jyw7GjgFGNnEbZwHnAfQq1cvZs6cCcCAAQPo0KEDCxcuBKBLly4MHz6c2bNnA5CXl8eYMWMoLy/ns88+A6C4uJh169YB+zflv46tsrKS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pGs3dhtKoJKTqqur+f73v88zzzzDkiVLePDBB1myZMkOZe6++246derEe++9x0UXXcRll10GwIgRIygrK+PNN99k+vTpfOc736Gqqoq8vDxuvvlmlixZwmuvvcZvfvObnbYpkimpOOYBpkyZwvTp09O+P7sDJVDJSfPnz2fgwIEMGDCAPffck9NOO43HH398hzKPP/44Z555JgAnnXQSL7zwAu7O3nvvTV5eHgDbtm3DzADo2bMnRUVFAHTo0IGCggLWrFmTxr0SaVgqjnmAsWPH0rlz5/TtyG5ECbSVi9sk9NxzzzFq1CgOOOAARo3QmdgGAAAUOUlEQVQaxYsvvgjA5s2ba5uKRo4cSdeuXbnwwgtbPO41a9bQt2/f2td9+vTZKdkllsnLy+MrX/kKGzZsAGDevHkMHz6cAw44gDvuuKP2x6XGqlWreOONNygpKWnx2EXiSPUxL8lTAm3FmtMk1LVrV5588knefvtt7r33Xs444wwg1NzefPPN2sd+++3HCSeckPZ925WSkhIWL17M66+/zg033MC2bdtq123ZsoUTTzyRW265hY4dO2YwyuzV0ideANu3b+e8885j8ODBDB06lEcffTRdu9MqNHbMSzxKoK1Yc5qEDjroIHr16gXA8OHD2bp1K5WVlTu8d9myZaxfv57DDjusxWPv3bs3q1evrn1dUVFB7969GyxTVVXFp59+SpcuXXYoU1BQQPv27Vm0aBEAX3zxBSeeeCKnn356Vib+bJCKEy+A6667jm7durFs2TKWLFnCuHHj0rpf2S5Vx7zEpwTaijW3SajGo48+SlFREfn5+TssnzZtGqeeeuoO11taysEHH8zy5ctZuXIl27dvZ9q0aUyaNGmHMpMmTeLee+8F4JFHHuGII47AzFi5cmVtB4r333+fd999l379+uHunHPOORQUFHDxxRe3eMy7i1SdeN1zzz1cfvnlALRp04auXbumca+yXyqOeWkeJVBplsWLF3PZZZdx55137rRu2rRpTJ48OSX/b15eHrfddhsTJkygoKCAU045heHDh3P11VfzxBNPAHDOOeewYcMGBg4cyNSpU2ubGufMmUNhYSEjR47k+OOP5/bbb6dr16688sor3H///bz44ou113CffvrplMSfy1Jx4rVp0yYArrrqKoqKijj55JNZt25divckt6TimAeYPHkypaWlLF26lD59+nD33XenbB9S0fT/9a9/ncLCQoYPH875559PdXV1yuKvS1eRW7FkmoT69OmzU5NQRUUFxx9/PPfddx/777//Du9buHAhVVVVjBo1KmXxT5w4kYkTJ+6w7Nprr619vtdee/Hwww/v9L4zzjhjh6bDGmPGjMHdWz5Q2UnNideMGTOA0NxYUVHB6NGjmTp1KlOnTuWSSy7h/vvvz3Ck2aWlj3mABx98sGWDbEBN0/9zzz1Hnz59OPjgg5k0aRLDhg2rLZPY9D9t2jQuu+wyHnroodqm/169erFo0SImTJhQe9L25z//mY4dO+LunHTSSTz88MOcdtppadkn1UBbseY0CW3atIljjz2WG2+8kUMPPXSnbT/44IMpq31KZjX3Wlx9J15dunRh7733rr3ufPLJJ1NeXp6O3ZE0SVXTf01Hv6qqKrZv356SS0YNUQ20FUtsEqqurubss8+ubRIqLi5m0qRJnHPOOZxxxhkMHDiQzp07M23aNABuu+023nvvPa699traM+AZM2bQrVs3IJwVpqP589xbUrftu1p+9M1uIfHEq3fv3kybNo0//elPO5SpOfEqLS1t0omXmXHccccxc+ZMjjjiCF544YUdaiaS++pr+p83b16DZRKb/hOvh9fX52LChAnMnz+fY445hpNOOinFe/IvSqCtXNwmoSuvvJIrr7yywe2uWLGi5YKUrJKqE6+bbrqJM844gwsvvJB99tmHP/zhD5nczayVypNGyO4Tx7pN/zWeffZZtm3bxumnn86LL77IUUcdlZZ4lEBFJGmpOPHab7/9mD17dssGKlkjlX0uIBxz3/jGN3j88cfTlkB1DVRERFIuFX0utmzZwocffgiEa6BPPfUUQ4cOTds+qQbayrXm5iARSZ9UNP27O5MmTaKyspIvv/yS8ePHc/7556dvn9L2P4nIbkMnXhJHKpr+X3/99ZYNMglqwhUREYlBNVAREUmL3a3lQjVQERGRGJRARUREYlACFRERiUEJVEREJAYlUBERkRiUQEVERGJQAhUREYlBCVRERCQGJVAREZEYlEBFRERiUAIVERGJQQlUREQkBiVQERGRGNKeQM3se2a20sy2mdkCMztsF+XHReW2mdkKM9vpbqnJblNERKS50ppAzexU4FbgeuAg4FXgGTPbt4Hy/YGno3IHATcAvzazE+NuU0REpCWk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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fc6332a30f0>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "plot_histogram(result.measurement)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Boolean Logical Expressions\n",
    "\n",
    "Qiskit's `Grover` can also be used to perform Quantum Search on an `Oracle` constructed from other means, in addition to DIMACS. For example, the `LogicalExpressionOracle` can actually be configured using arbitrary Boolean logical expressions, as demonstrated below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAAFOCAYAAAA2MUwzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xt8FNX9//HXIYEAAspF7ihEBCFIMIYiFrloFcWWflW8Uu/Wa7VK+xPbem+rWK1frUptra1K/YriDeutKBYQQUJAkYsiSkBIEQVvgBBI+Pz+OJO4LBvIzs6GDXk/H495JDsz+5mzs7PzmTlz5owzM0RERCQ5DfZ0AUREROoiJVAREZEQlEBFRERCUAIVEREJQQlUREQkBCVQERGREJRARUREQlACFRERCUEJVEREJITsPV2APalNmzbWtWvXPV0MERHJIPPmzVtnZvvvbr56nUC7du1KcXHxni6GiIhkEOfcyprMpypcERGREJRARUREQlACFRERCUEJVEREJAQlUBERkRCUQEVEREJQAhUREQlBCVRERCQEJVAREZEQlEBFRERCUAIVEREJQQlUREQkBCVQERGREJRARUREQlACFRERCUEJVEREJAQlUBERkRCUQEVEREJQAhUREQlBCVRERCQEJVAREZEQlEBFRERCUAIVEREJQQlURER269VXX6Vnz550796dcePGVTvfM888g3OO4uLiqnHvvfceAwcOJC8vj0MPPZQtW7YAMHToUHr27Em/fv3o168fn332Wdo/R5Sy93QBREQks1VUVHDFFVfw2muv0blzZ/r378/IkSPp3bv3DvNt2LCBe++9lwEDBlSNKy8v5yc/+QkTJkwgPz+f9evX07Bhw6rpjz/+OIWFhbX2WaKkM1AREdmloqIiunfvTm5uLo0aNeKMM85g8uTJO813ww03MHbsWBo3blw1bsqUKfTt25f8/HwAWrduTVZWVq2VPZ2UQEVEZJdKS0vp0qVL1evOnTtTWlq6wzzz589n1apVnHjiiTuM//DDD3HOMXz4cAoKCvjDH/6ww/Tzzz+ffv368dvf/hYzS9+HSANV4YqISEq2b9/OmDFjeOSRR3aaVl5ezsyZM5k7dy5NmzblmGOO4fDDD+eYY47h8ccfp1OnTmzYsIFTTjmFCRMmcM4559T+BwhJZ6AiIrJLnTp1YtWqVVWvV69eTadOnapeb9iwgUWLFjF06FC6du3K22+/zciRIykuLqZz584MHjyYNm3a0LRpU0aMGMH8+fOr4gI0b96cs846i6Kiotr9YClSAhURkV3q378/y5Yto6SkhK1btzJx4kRGjhxZNX3fffdl3bp1rFixghUrVnDEEUfwwgsvUFhYyPDhw1m4cCHffvst5eXlTJ8+nd69e1NeXs66desA2LZtGy+++CJ9+vTZUx8xFFXhiojILmVnZ3P//fczfPhwKioquOCCC8jLy+PGG2+ksLBwh2Qar2XLlowZM4b+/fvjnGPEiBGceOKJbNq0ieHDh7Nt2zYqKir4wQ9+wE9/+tNa/FSpc3Xtom2UCgsLLfZeJREREefcPDPb7b01qsIVEREJQQlUREQkBCVQERGREJRARUREQlACFRERCUEJVEREJAQlUBERkRCUQEVEREJQAhUREQlBCVRERCQEJVAREZEQ1Jm8iIik5Kf31Hzeh65OXzlqm85ARUREQlACFRERCUEJVEREJIRaT6DOucudcyXOuS3OuXnOuaNq+L5Bzrly59yiuPHnOecswdA4PZ9ARESklhOoc+504F7gNuAwYBbwinPugN28ryXwGDC1mlm+BTrEDma2Japyi4iIxKvtM9AxwCNm9pCZvW9mVwJrgMt2876HgUeB2dVMNzP7NHaIsMwiIiI7qbXbWJxzjYDDgbviJk0BjtzF+y4H2gG/A26oZrYmzrmVQBbwLnCDmb1TTbyLgYsBOnbsyLRp0wDIzc2lefPmLFiwAIDWrVuTl5fHjBkzAMjOzmbQoEHMnz+fb775BoDCwkLWrl3LqlWrADj44IPJyclh0SJfy9y2bVt69OjBzJkzAcjJyWHgwIEUFxezceNGAAYMGMDq1aspLS0FoGfPnmRlZbFkyRIA2rdvT7du3Zg92x87NGnShAEDBjBnzhw2b94MwMCBAykpKeHTT/1xQ+/evamoqGDp0qUAdOrUic6dOzNnzhwAmjVrRmFhIbNnz6asrAyAQYMG8eGHH/LZZ58B0KdPH8rKyli2bBkAXbp0oV27dhQXFwPQokULCgoKmDlzJuXl5QAMHjyYxYsXs379egDy8/PZsGEDy5cvB6Br1660atWK+fPnA9CyZUvy8/OZPn06ZoZzjiFDhrBgwQK+/PJLAAoKCvjiiy9YsWKFvid9T/qeMvR7gk7U1LRp0zL+e6opZ2Y1njkVzrmOQCkwxMxmxIy/ERhtZj0TvOdQ4HXgCDMrcc7dDIwysz4x8wwEegALgObAz4ERQL6ZLdtVmQoLC61yAxYRkXD2tvtAnXPzzKxwd/NlbEcKzrkc4Engl2ZWUt18ZjabmKpd59ws/FnolcBV6S6niIjUT7WZQNcBFfjq2FjtgETXLDsAvYB/OOf+EYxrADjnXDkwwsymxL/JzCqcc8XAwZGVXEREJE6tNSIys63APODYuEnH4lvjxisFDgX6xQwPAh8F/yd6D845B/TFN04SERFJi9quwr0bmOCcKwLeAi4FOuITI865xwDM7Bwz2wbE3/P5GVBmZotixt0EvA0sA1rgq237svuWvSIiIqHVagI1syedc62B6/FVtIvwVbErg1l2eT9oNfYD/gq0B74G3gEGm1lRBEUWERFJqNYbEZnZeGB8NdOG7ua9NwM3x427BrgmmtKJiIjUjPrCFRERCUEJVEREJAQlUBERkRCUQEVEREJQAhUREQlBCVRERCQEJVAREZEQlEBFRERCUAIVEREJQQlUREQkBCVQERGREJRARUREQlACFRERCUEJVEREJAQlUBERkRCUQEVEREJQAhUREQlBCVRERCQEJVAREZEQlEBFRERCUAIVEREJQQlUREQkBCVQERGREJRARUREQlACFRERCUEJVEREJAQlUBERkRCUQEVEREJQAhUREQlBCVRERCQEJVAREZEQlEBFRERCUAIVEREJQQlUREQkBCVQERGREJRARUREQlACFRERCSGpBOqcO805d1zM6xudc6udc/92znWIvngiIiKZKdkz0Jsr/3HOFQC/Bv4ENAT+GF2xREREMlt2kvMfCCwN/j8JeN7M/uCcmwL8O9KSiYiIZLBkz0C3AM2D/48BXg/+/zpmvIiIyF4v2TPQN4E/OudmAoXAqGB8D2BVlAUTERHJZMmegf4M2IpPnJea2X+D8SegKlwREalHkjoDNbPVwI8SjL86shKJiIjUAUnfB+qca+ycG+WcG+uc2y8Yd5BzrlX0xRMREclMSZ2BOue64xsONQP2AyYBXwGXBa8virqAIiIimSjZM9B7gClAO2BzzPgXgGFRFUpERCTTJdsK90jgCDOrcM7Fjv8E6BhZqURERDJcmL5wGyYYdwD+XlAREZF6IdkEOgUY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7ezsbP74xz+yZMkS3n77bR544IGdYma6dK3vtm3b0qdPn3QXX2qJEmgNFBUV0b17d3Jzc2nUqBFnnHEGkydP3mGeyZMnc+655wIwatQopk6dipkB8Pzzz9OtWzfy8vKq5nfO0axZMwC2bdvGtm3bcM7V0ieSuiQdB3AA5513HnfeeSeNGjWKdNvu0KEDBQUFADRv3pxevXpRWloazcqoBelc36+++mray18XhT1gKSoqol+/fvTr14/8/Hyee+65qvfce++99OnTh7y8PO655560lFsJtAZKS0vp0qVL1evOnTvvtEOInSc7O5t9992X9evXs3HjRu64446EVbQVFRX069ePVq1asWLFCkaPHh3JxrN06dKq8f369aNFixZp2YCi3uhrq9x1TToO4AAGDx7Mt99+S8OGDavGRbVtV1qxYgXvvPMOAwYMCL8Calk613erVq3YsGFD2n43ubm5NGjQgP333z+yRPTVV18xatQoDjnkEHr16sXs2bPDrdhqpHLA0qdPH4qLi6tq8S655BLKy8tZtGgRDz30EEVFRSxYsIAXX3yRjz76KNJygxJo2t18881cc801VWebsbKyspg3bx4dOnSgR48eTJo0KZKNp2fPnrz77ru8++67zJs3j6ZNm3LSSSdF+rnSsdHXRrnTLR1H0iNHjmTu3Ln069ePwsLCyJNcWLvatgE2btzIKaecwj333EOLFi0iX366pOuAGfzvZs2aNWn53cybNw/nHK1atWLWrFmRxAb4+c9/zvHHH88HH3zAggUL6NWrVwprd2epHLA0bdqU7OxswLcrqazFe//99xkwYEDV9CFDhvDss89GWm5QAq2RTp06sWrVqqrXq1evplOnTtXOU15eztdff03r1q2ZM2cO1157LV27duWee+7htttu4/777696X1FRET169GDEiBFMnTo1ko0n1tSpUznooIM48MADo1kZMeWOeqOPNW7cOL7++muOOeaYSBJRbTTaSsdBRaURI0bw7rvvUlxcnFSZdpfk2rdvz7Zt26peR7Vtb9u2jVNOOYXRo0dz8sknJ1Xmumx363vBggWhq8x397spKiqiZcuW9OzZk4MPPjiS2F9//TUzZszgwgsvBKBRo0bst99+qayinaRywAIwZ84c8vLyOPTQQ3nwwQfJzs6mT58+vPnmm6xfv55vv/2Wl19+eYd9eFSUQGugf//+LFu2jJKSErZu3crEiRMZOXLkDvOMHDmSRx99FICnn36ao48+Guccb775JitWrGDFihVcffXV/PrXv+ZnP/sZn3/+OV999RWlpaV06NCB1157jUMOOSSSjSfWXXfdxUcffRTpGdEFF1zA8ccfT1FRUdW4KMtdUVHBHXfcwdixYyNLRLGNtu644w7+8Ic/0Llz50jXSZs2bVi7dm3kO8fs7Owd1m2UB3B9+/Zl69atkW7bZsaFF15Ir169GDNmzE7rN9Ol84D5008/DV1lDrv+3ZSWlvLNN99w5plnRha7pKSE/fffn/PPP5/DDjuMiy66iE2bNoVYq+kzYMAAFi9ezNy5c7n99tvZsmULvXr1YuzYsRx33HEcf/zx9OvXj6ysrMiXrQRaA9nZ2dx///0MHz6cXr16cdppp5GXl8eNN97ICy+8AMCFF17I+vXr6d69O3fffXfCHXOsNWvWMGzYMH7xi18wefJkjj32WH74wx8mXbZEG0+lzZs3M3XqVP71r39FekZ03nnn8Zvf/Cbpsta03G+99RZbtmzhsssuiywRVTbaqqio4KqrriI3N5eJEydGuk5+9atfpWXnmJOTw6xZs+jTpw/jx4+PJMlVys7OpkOHDpFu22+99RYTJkzgjTfeqDrgePnll3f5nkySjgPmqOzqd1NeXs4nn3zCqaeeGlns8vJy5s+fz2WXXcY777zDPvvss9vvP1mpHLDE6tWrF82aNWPRokWA327nzZvHjBkzaNmyJT169Ii03ACYWb0dDj/8cNvTZs2aZccdd1zV69tuu81uu+22HeY57rjjbNasWWZmtm3bNmvdurVt3759p1jDhg2zuXPnVr0eN26ctW7dOuXYy5cvt7Zt29q2bduqxj3zzDO2zz77pKXc1157rXXs2LHq9WOPPWZXXHHFDu/Jy8uzVatWVb3Ozc21zz//3MzM3n77bevdu7fts88+9uyzz1bNU15ebt27d7esrCy79tprI18nDzzwgO23336hy11pyZIl1r9/f9u8ebOZma1evdpeeukly83NtUaNGtlFF11kZmY33HCDTZ482czMNm/ebKNGjbKDDjrI+vfvbx9//LHFu+mmm+zOO++sen3GGWdY+/btLTs72zp16mR/+9vfdnpPql555RXr0aOHHXTQQXb77bfvNH3Lli122mmn2UEHHWTf+973rKSkxMzMpkyZYgUFBdanTx8rKCiwqVOnmpnZN998Y/n5+VVD69at7ec//3nk5X7ppZfs4IMPttzcXPvd735nZtGs71atWplzrmp9Z+LvPTb2mjVr7MADD6waP2PGDBsxYsRO81/0vzUf4m3bts26detmy5cvt7KyMuvbt68tWrRoh3nuv/9+u+SSS8zM7IknnrBTTz3VzPzvsPI3uGLFCuvQoUPV72nt2rVmZrZy5Urr2bOnffnllzsvvBpAsdUgh+zxJLYnh0xIoOnaeMzMjjzySDvqqKOqXkeViMzMli1bZg0bNszIcleKT0RmZpOUKF0pAAAc60lEQVQmTbKzzz7bhg4dagsXLox0naTzoKJS/E45k5WXl1tubq59/PHHVdvI4sWLd5jngQce2GEbOe2008zMbP78+VZaWmpmZgsXLtzhgCpWQUGBTZ8+PY2fIlrp/L2feuqp1qZNm8hjDxo0yD744AMz89vfL3/5y50+VyoJ1Cz8Actjjz1mvXv3tvz8fDvssMPsueeeq4o5aNAg69Wrl/Xt29def/316r+UBGqaQLN3d4Yqu/fTJO60eOjqHV/HVg9XVFRwwQUXVFWhFRYWMnLkSC688ELOPvtsunfvTqtWrZg4cSIAM2fOZNy4cTRs2JAGDRowfvx42rRpA8CmTZt47733UmrFWlml8/7773Puuedywgkn0Lhx46pyV1b9RV3uhQsX0r9//6py7KpKp3PnzjWq0iksLKwa36hRI4YNG8arr75Ku3btIlsnsdcTO3XqxMSJE/m///u/Hd5fWfU3cODAHar+SkpK6NKlC9nZ2axcuZIPPviArl27smnTJrZv307z5s3ZtGkTU6ZM4cYbb0yqzKlIZtuGHbfv2IZmQFVVfO/evavmmTx5MjfffDPgq+Irr6EedthhVfPk5eWxefNmysrKyMnJqRr/t7/9jffee48LLriAiy66iOuuu26HspSVlXHOOecwb948WrduzZNPPknXrl157bXXuO6669i6dSuNGjXizjvv5Oijjwbg+OOPZ82aNZSXl3PUUUfxwAMPRHrtLJ2/96lTp/Lggw9GHvu+++5j9OjRbN26ldzcXP7xj39Etj4qjRgxghEjRuww7tZbb636v3HjxkyaNGmn95199tmcffbZCWO++eab0RYyASXQDJCOjWefffZhypQpVTsniD4RNW/e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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fc6334b54e0>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "expression = '(w ^ x) & ~(y ^ z) & (x & y & z)'\n",
    "oracle = LogicalExpressionOracle(expression)\n",
    "grover = Grover(oracle)\n",
    "result = grover.run(QuantumInstance(BasicAer.get_backend('qasm_simulator'), shots=1024))\n",
    "plot_histogram(result.measurement)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In the example above, the input Boolean logical expression `'(w ^ x) & ~(y ^ z) & (x & y & z)'` should be quite self-explanatory, where `^`, `~`, and `&` represent the Boolean logical XOR, NOT, and AND operators, respectively. It should be quite easy to figure out the satisfying solution by examining its parts: `w ^ x` calls for `w` and `x` taking different values; `~(y ^ z)` requires `y` and `z` be the same; `x & y & z` dictates all three to be `True`. Putting these together, we get the satisfying solution `(w, x, y, z) = (False, True, True, True)`, which our `Grover`'s result agrees with."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## TruthTable Oracles\n",
    "\n",
    "With Qiskit, `Oracle`s can also be constructed from truth tables, meaning we can also perform Quantum Search on truth tables. Even though this might seem like a moot point as we would be essentially searching for entries of a truth table with the $1$ value, it's a good example for demonstrative purpose."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "truthtable = '1000000000000001'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As shown, the `truthtable` is specified with a bitstring containing values of all entries in the table. It has length $16$, so the corresponding truth table is of $4$ input bits. Since the very first and last values are $1$, the corresponding truth table target entries are `0000` and `1111`.\n",
    "\n",
    "Next, we can setup the `Oracle` and `Grover` objects to perform Quantum Search as usual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAccAAAFOCAYAAADzQ9aiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xl8VNX9//HXYQsgRAFZAwjIIgQEQyxSkcW6FRXrhtvPrVXrrqV+ta0Ut9Zqq1ZbqyhdRHDDpaCilrogojEYKJRFESVYElkUEQhgkPD5/XFu4nCZQGbmThZ4Px+PeTC5c+dzDzN37ueec88515kZIiIi8p16NV0AERGR2kbJUUREJETJUUREJETJUUREJETJUUREJETJUUREJETJUUREJETJUUREJETJUUREJKRBTRcgXQ488EDr0qVLTRdDRERqkblz535pZq33tN5emxy7dOlCQUFBTRdDRERqEefcZ1VZT82qIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiIiIUqOIiKSNq+99hq9evWie/fu3HXXXbu8Pn78ePr168eAAQMYMmQIS5YsAeDbb7/lwgsvpF+/fvTu3Zvf/e53Fe/54x//SHZ2Nn379uWcc87hm2++ibzcSo4iIpIWZWVlXHXVVbz66qssWbKEp556qiL5lTv33HNZuHAh8+fP58Ybb2TMmDEAPPvss5SWlrJw4ULmzp3LI488wooVKyguLuZPf/oTBQUFLFq0iLKyMp5++unIy67kKCIiaTFnzhy6d+9Ot27daNSoEWeffTbTpk3baZ3MzMyK55s3b8Y5B4Bzjs2bN7N9+3a2bt1Ko0aNKtYtX7Z9+3a2bNlChw4dIi+7kqOIiKRFcXExnTp1qvi7Y8eOFBcX77LeX/7yFw4++GBuvPFG/vSnPwFwxhlnsN9++9G+fXs6d+7MDTfcQMuWLcnKyuKGG26gc+fOtG/fnv3335/jjjsu8rIrOYqISI266qqr+PTTT7n77rv5zW9+A/haZ/369fn8888pLCzk3nvvZfny5axfv55p06ZRWFjI559/zubNm5k8eXLkZVJyFBGRtMjKymLlypUVfxcVFZGVlVXp+meffTZTp04F4Mknn+SEE06gYcOGtGnThiOPPJKCggJef/11unbtSuvWrWnYsCGnnXYa7733XuRlV3IUEZG0OPzww1m2bBmFhYVs27aNp59+mlGjRu20zrJlyyqeT58+nR49egDQuXNn3nzzTcBfi3z//fc55JBD6Ny5M++//z5btmzBzHjjjTfo3bt35GVXciT5rsZPPPEEAwYMqHjUq1eP+fPnAzB8+HB69epV8dratWur9f8kIlLTGjRowIMPPsjxxx9P7969GT16NNnZ2YwbN44XX3wRgAcffJDs7GwGDBjAfffdx8SJEwHf1FpSUkJ2djaHH344F198MYceeiiDBg3ijDPOICcnh379+rFjxw4uu+yyyMvuzCzyoLVBbm6uFRQU7HG9srIyevbsyb///W86duzI4YcfzlNPPUWfPn0q1tm4cWNFL6kXX3yRhx56iNdee22nOAsXLuRHP/oRn376KeCT4z333ENubm6E/ysREUmFc26ume3xwFztNUfn3JXOuULn3DfOubnOuaOq+L4hzrntzrlFUZYnla7GsZ566inOPvvsKIsmIiI1pFqTo3PuLOAB4E7gMOA94FXnXOc9vK8F8DjwRtRlSqWrcaxnnnmGc845Z6dlF198MQMGDOCOO+5gb62hi4jsjaq75jgGeMzMJpjZh2Z2DbAKuGIP7/sbMBHIS3cBKxOvq3G5/Px8mjZtSt++fSuWPfHEEyxcuJB33nmHd955h0mTJlV3kUVEJEnVlhydc42AgcCM0EszgO/v5n1XAm2B31S2TipS6Wpc7umnn96l1lgeo3nz5px77rnMmTMnwlKLiEg6NajGbR0I1AfWhJavAY6J9wbnXD/gFuAIMyuLd60vtP5lwGUAHTp0YObMmQB069aN5s2bs2DBAgBatWpFdnY2s2bNoqysjIULF1JYWMjatWv561//ytixYykpKWHNmjWsXLmSoqIiRowYQUZGBo8++ijt2rVjyZIl9OzZk1mzZjF58mQefvhhAAoKCtiwYQMlJSUcd9xxFBYW8o9//IOBAweyatUq6tevX9HbtV27dnTt2pW8PF8hbtKkCYMGDSI/P5+tW7cCMHjwYAoLC1m9ejUAffr0oaysjKVLlwI+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DsDQoUNZvHgx69atA6B///5s2rSJ5cuXA9ClSxdatmzJvHnzAGjRogX9+/fn7bffxsxwzjFs2DAWLFjA+vXrAcjJyeGrr75ixYoVKX9PK1euBKBHjx5kZGSwaNEiANq0aUPPnj2ZPXs2ABkZGQwePFjfk74nfU+14nsaTlWtWrUqku+pqpyZVXnlVDjnOgDFwDAzmxWzfBxwnpn12sP7Xwa+NLOLqrK93NxcK985U3Hp/YmtP+H6lDcpIrJPSOT4GtWx1Tk318xy97SeequKiIiEVGdy/BIoA9qGlrcFVldjOURERHar2pKjmW0D5gLHhl46Ft9rVUREpFaotg45gfuASc65OcC7wOVAB2A8gHPucQAzu6D8Dc65AcHTTGBH8Pc2M1tSnQUXEZF9R7UmRzN7xjnXChgLtAcWASPN7LNglXjjHf8T+vtk4DOgS7rKKSIi+7bqrjliZg8BD1Xy2vA4y1y6yyQiIhJLvVVFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFRERClBxFqui1116jV69edO/enbvuumuX10tLSznrrLPo3r07gwYNYsWKFQD8+9//ZuDAgfTr14+BAwfy5ptvVrznhBNOoH///mRnZ3P55ZdTVlZWXf8dEdkNJUeRKigrK+Oqq67i1VdfZcmSJTz11FMsWbJkp3X+9re/0aJFCz755BN+9rOfcdNNNwFw4IEH8tJLL7Fw4UImTpzI+eefX/GeKVOmsGDBAhYtWsQXX3zBs88+W63/LxGJT8lRpArmzJlD9+7d6datG40aNeLss89m2rRpO60zbdo0LrzwQgDOOOMM3njjDcyMww47jA4dOgCQnZ3N1q1bKS0tBSAzMxOA6dOn869//Yvrr78+slrpzTffTOvWralXr16ktd2bb76ZTp060axZsyQ/TZHaT8lR9irJNn2uW7eOESNG0KxZM66++uqd3vPMM89w9tlnM2fOnIraYMeOHSkuLt5pveLiYjp16gRAgwYN2H///Vm3bt1O6zz//PPk5OSQkZFRsey4447jlFNO4eijj6awsDCyWunIkSPZb7/9aNy4caS13ZNPPpk5c+ZU8g3UfunaRw499FCys7MrPsPaUu7dnejMnTuXfv360b17d6699lrMLC1lr4uUHCWuqA8gmzZtYsCAAQwYMIBu3bpRv359DjjggEhj9+/fn1NOOYW1a9fywx/+MKFk0LhxY+644w7uueeendZft24d//d//8ctt9zC6aefzurVq3njjTeS+kwXL17MTTfdxCOPPLLT8ttuu42jjz6ahg0bMnv27MhqpfXq1aNXr17Uq1cv0truEUccQfv27ZP6DGpaKs3je9pH3njjDRYvXpzSPpKOcu/uROeKK65gwoQJLFu2jGXLlvHaa69FWu66TMlRdpGOA0jz5s2ZP38+c+fOxTlH7969ef755yONPX78eIYPH063bt0488wzE0oG++23H0OGDKFx48Y7rb98+XJ69OhB7969WblyJccccwzPP/88RUVFZGVl7bRuVlYWK1euBGD79u1s2LCBVq1aAVBUVMSpp57K448/zsEHH7zT+4qLiznooIM45ZRTmDZtWmS10tj3QLS13XRLR+1u27ZtnHbaaaxevZqRI0fy0ksvRbqPtG7dGqBiH4lSOpr1V61axcaNGzniiCNwznHBBRcwderUSMtdlyk51mHpOICA/yFu2rSJUaNGJfxDrOwAEhu7Q4cObNiwgaOPPjrS2MXFxWRmZrJ27VqOOuqopJNBrO7du7N06VJat27NsmXLeOKJJ/jss894+umnGTVq1E7rjho1iokTJwLw3HPPcfTRR+Oc4+uvv+bEE0/krrvu4sgjj6xYv6SkhFWrVgGwY8cOpk+fziGHHFJpWXanslppqtIVd3fScXIG8Nvf/pYGDRpwzjnnsGTJEoYNGxbpPrJixQqmT5/OlVdeycSJEyP7TQ4fPpzTTz+dgoICBgwYwNq1ayM50SkuLqZjx46AP5bcdNNNTJ48OdJy9+rVq6LFaO3atZV+hrWRkmOapSOBnXDCCRx66KGMGjWKgQMHsnDhwsgOIAAvvPACzZs3r/g7igNI7Pu2bNnCWWedhXMu0tjgz+LLY0ehRYsWPPzww5x33nk0atSI/Px8Zs6cyejRo8nOzmbcuHG8+OKLAPzkJz9h3bp1dO/enfvuu6/i+37wwQf55JNPuP3223c6UGzevJlRo0Zx0003MWXKFNq0acPll18eWa009j3l60VV2y1fP8p9e8uWLZx44ol069aNNWvW8Oijj0Z6cvb3v/+dU089FfBNzgceeOAu6ySjfB8ZPXo0p59+OqNHj+YHP/hBpL/J6667jlNPPZX58+fTpk2bpMpZ2YlO+cnIH/7wB4YNGxZpuZ944gnmz5+fUrlripJjGqXrDHjKlCk88sgjjBgxgtLSUqZNmxbZAaSkpISXXnqJww47LKqPYReffvop55xzTuRxs7KyWLp0aUXsRJNBZU4++WTy8/P56KOPuPvuu7nqqqu4+eabAbj99tsrapCNGzfhJZvuAAAddElEQVTm2Wef5ZNPPmHOnDl069YNgLFjx7J58+aKg0T5gaJt27Z88MEHLF26lDZt2jBmzBh27NgRSa0U4PDDD2fZsmXs2LGDbdu2RRYX/L69bdu2yPftG264gXvvvZfRo0fz7rvv8uqrr0ZyAvX1118D8PLLLzNlyhTOPPNM1qxZE+k+8sADDzBs2DAGDRrEIYccEmmrSOvWrSM/0cnKyqKoqKiiyXbHjh106tQp0nLXZUqOaZTKdYLd7XSZmZkUFxeTlZXFtm3bIq2B/frXv+aiiy7aqQkkqgMI+NrBt99+y8CBAyOP3ahRI0pLS2nZsmXCyWB3yj+L9evX89BDD3HJJZfssSyJaNCgAQ8++CDHH388vXv3jqRWCvCrX/2KjRs3snXrVpo2bUqrVq0iiXvjjTfSrl07zIyhQ4dy5513RrJvN23alBEjRgC+ZpeTk0NRUVEkn/H27dsrEsSBBx5Iz549+dnPfhbpPlJcXEybNm0q9pEoW0Xuu+8+Zs6cyZgxYygtLY3kRKd9+/ZkZmby1ltv0bFjRx5//HFOOeWUSMt98cUXM2DAAO6444461xO2QU0XYG8Wr0NEfn5+pevE7nR7avK54447+Oijjzj99NM544wzePLJJ1Mu7/z58/n000/5wx/+wEMPPUTjxo0rkkw4fvkPcfDgwVU+gAAsWrSIRo0aUVhYSFZWVqSxn332Wc4880yOP/54ysrK+PGPf1yRDHJzcxk1ahQ/+clPOP/88+nevTstW7bk6aefrnh/ly5d2LhxI9u2bWPq1KnMmDGDPn36cN1117FgwQIAxo0bR8+ePXfZ9qX377F4FSZcv+uykSNHMnLkyJ2W3X777RXPy2ulYWPHjmXs2LFxt/P73/+e3//+97ssjyLu9773PV577TX++te/AjBp0qTI9u2srCwKCwspLCzkuuuu45lnnqn0BKpjx45VOoFq1aoVTZs25cwzz6R58+ZcffXVFBUVccstt0S2j7zzzjuUlJQwfvx4evbsucvnkawnnniCrKwsnnvuOS688EImT57MddddV+Vyx57olH/3M2bMqEjkp556Khs2bOCCCy7ghz/8IZMnT4603Js2beL0009n0qRJXHDBBZHErg5KjnXU+PHjGTduHKWlpbz55pu7rYFV9QCSl5dHQUEB3bt3Z8uWLaxcuZL999+fsWPHRnIAAX9Ge9ddd0WewMA3N7/yyiu7dGqpSjIAKq6JhT311FOVfmYSvcMOO4y8vDx+/vOf07Fjx0hOoJxznHzyycycOZORI0cybtw4pk+fvlPzeLlk95G8vDxuvfVWzj77bGD3rSJV/U2Wvwd87bukpISCgoKEyr27E53c3FymTJnCrbfeyoMPPpiWcjdv3pxzzz2XOXPmKDmKl0iHiER2OvDXkz799FOuuuoqXnjhBd57772UDyBXXHEFV1xxBeAPAieddBKLFi2qeD3VAwj4DjMAP/3pT3daHmXsvUkiNVKIXytNR+x07ttXXnklxxxzDM888wxPPvlkZCdQd999N+effz7XX389rVu35h//+EdiH8AelF/jjbJVZPv27Xz99dcceOCBfPvtt7z88sscc8wxu6yXSstFTZa7NlNyTKN07HQlJSVs2rSJ9u3b88ADD3DuuefSuHFjrr/++shqYHurVJs+5Tvp2LfB13I2bNjA1KlTqVdv5y4RqZ5AHXTQQcyaNWu320/lhCH22nFUrSIHHXQQxx9/PN9++y1lZWUcc8wxXHrppYkVcg/qarnTzdW1i6RVlZubawUFBSnHSfXM/ZVXXuH666+v2OluvvnmnXa6b775hvPPP5///Oc/FTtdeS/H2J3ugAMOYMaMGbRq1YqTTjqJ0tJSduzYwYgRI/jjH/9IgwbVd56TziSj2MnHre7YUe/bmZmZdOrUiUMOOaRiwoGrr7468g5Qu5POzzud6uqJX02U2zk318xy97Seao5plmxHC6j8DPiDDz6IrHwiyUrHvl2Vk3UlsOpVV8udKiXHGlQXazIiIvsCJUcRiVxdrd2JlNMkACIiIiFKjiIiIiHVnhydc1c65wqdc984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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fc6332ad400>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "oracle = TruthTableOracle(truthtable)\n",
    "grover = Grover(oracle)\n",
    "result = grover.run(QuantumInstance(BasicAer.get_backend('qasm_simulator'), shots=1024))\n",
    "plot_histogram(result.measurement)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As seen in the above plot the search result coincides with our expectation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<h3>Version Information</h3><table><tr><th>Qiskit Software</th><th>Version</th></tr><tr><td>Qiskit</td><td>0.23.0</td></tr><tr><td>Terra</td><td>0.16.0</td></tr><tr><td>Aer</td><td>0.7.0</td></tr><tr><td>Ignis</td><td>0.5.0</td></tr><tr><td>Aqua</td><td>0.8.0</td></tr><tr><td>IBM Q Provider</td><td>0.11.0</td></tr><tr><th>System information</th></tr><tr><td>Python</td><td>3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 13:09:58) \n",
       "[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]</td></tr><tr><td>OS</td><td>Linux</td></tr><tr><td>CPUs</td><td>1</td></tr><tr><td>Memory (Gb)</td><td>5.827335357666016</td></tr><tr><td colspan='2'>Sun Nov 08 17:26:36 2020 EST</td></tr></table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div style='width: 100%; background-color:#d5d9e0;padding-left: 10px; padding-bottom: 10px; padding-right: 10px; padding-top: 5px'><h3>This code is a part of Qiskit</h3><p>&copy; Copyright IBM 2017, 2020.</p><p>This code is licensed under the Apache License, Version 2.0. You may<br>obtain a copy of this license in the LICENSE.txt file in the root directory<br> of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.<p>Any modifications or derivative works of this code must retain this<br>copyright notice, and modified files need to carry a notice indicating<br>that they have been altered from the originals.</p></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import qiskit.tools.jupyter\n",
    "%qiskit_version_table\n",
    "%qiskit_copyright"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
